     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.prod.mbean;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.prod.dto.ControlPeriodicoDetaDto;
import com.brain.prod.dto.ControlPeriodicoDto;
import com.brain.prod.manager.ControlPeriodicoDetaManager;
import com.brain.prod.manager.ControlPeriodicoManager;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("controlPeriodicoMBean")
@Scope("session")
public class ControlPeriodicoMBean extends GenericMBean implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(ControlPeriodicoMBean.class);
    
    /**
     * ControlPeriodicoManager encapsula la funcionalidad y comunica a la vista con la capa de negocio
     * @since 09/01/2014
     */
    @Resource
    private ControlPeriodicoManager manager;      
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * sessionMBean permite acceder a datos del usuario logeado
     * @since 09/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
        
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * bitacoraManager permite mostrar el historial de acciones realizadas sobre la entidad
     * @since 09/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;
    
    /**
     * ControlPeriodicoDetaManager encapsula la funcionalidad y comunica a la vista con la capa de negocio
     * @since 09/01/2014
     */
    @Resource
    private ControlPeriodicoDetaManager detaManager;    
    @Resource
    private ArchivoMBean archivoMBean;
    
    /**
     * lista variable usada en la vista listaControlPeriodico.xhtml que almacena un listado de la entidad ControlPeriodicoDto
     * @since 09/01/2014
     */
    private List<ControlPeriodicoDto> lista;
    
    /**
     * dto variable usada para almacenar los valores de la vista controlPeriodico.xhtml
     * @since 09/01/2014
     */
    private ControlPeriodicoDto dto;
    
    /**
     * dtoFiltro usado para almacenar los valores filtro de la vista listaControlPeriodico.xhtml
     * @since 09/01/2014
     */
    private ControlPeriodicoDto dtoFiltro;
    
    /**
     * detaDto variable usada para almacenar los datos de la entidad ControlPeriodicoDetaDto
     * @since 09/01/2014
     */
    private ControlPeriodicoDetaDto detaDto;
    
    /**
     * tituloDetalle variable usada en la construcción del título del detalle
     * @since 09/01/2014
     */
    private String tituloDetalle;
    
    /*
     *keyTitulo título de los paneles de la entidad padre
     * @since 09/01/2014
     */
    private String keyTitulo = "form.control.periodico.panel";
    
    /**
     * keyDetalleEntidad título de los paneles de la entidad detalle
     */
    private String keyDetalleEntidad = "key.entidad.control.periodico.deta";

    /**
     * Mètodo iniciar permite inicializar la entidad filtro y la lista. Retorna la dirección de la vista listaControlPeriodico.xhtml
     * @return retorna la dirección de la vista listaControlPeriodico.xhtml almacenado en la variable urlLista
     */
    public String iniciar() {
        this.dtoFiltro = new ControlPeriodicoDto();
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setDescripcionCorta("");
        this.lista = null;
        return this.manager.getUrlLista();
    }

    /**
     * Método buscar asigna a la variable lista el valor obtenido de la búsqueda realizada mediante un filtro.
     * @param ae normalmente null
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerControlPeriodico(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    /**
     * Método nuevo se encarga de setear la accion a realizar, contruir el título de los paneles, inicializar la entidad dto y
     * finalmente retorna la dirección de la vista ControlPeriodico.xhtml
     * @return retorna la dirección de la vista controlPeriodico.xhtml almacenada en la variable url
     */
    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = this.manager.inicializar();
        this.detaDto = this.detaManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * Método nuevoDetalle se encarga de setear la accionDetalle a realizar, contruye el título de los paneles de la entidad detalle,
     * inicializa la entidad detalle y asigna a ésta la entidad dto
     */
    public void nuevoDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());        
        this.detaDto = this.detaManager.inicializar();
        this.detaDto.setControlPeriodicoDto(this.dto);
    }

    /**
     * Método editar se encarga de setear la accion a editar, contruye el título usado en los paneles de le entidad,
     * inicializa le entidad detalle y finalmente retorna la dirección de la vista controlPeriodico.xhtml
     * @return retorna la dirección de la vista controlPeriodico.xhtml almacenado en la variable url
     */
    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaDto = this.detaManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * Método editarDetalle se encarga de setear la accionDetalle a editar, construye el título usado en los paneles de la entidad
     * detalle y obtiene la entidad detaDto para mostrarlo en la vista
     */
    public void editarDetalle() {
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = this.detaManager.obtenerPorId(this.detaDto.getId());
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
    }
    
    /**
     * Método ver se encarga de setear la accion a ver, construye el titulo de la entidad, inicializa la entidad detalle y 
     * finalmente retorna la dirección de la vista controlPeriodico.xhtml
     * @return retorna la dirección de la vista controlPeriodico.xhtml
     */
    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaDto = this.detaManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * Método verDetalle se encarga de setear la accionDetalle a ver, constuye el título usado en los paneles de la entidad
     * detalle y finalmente obtiene la entidad detaDto para mostrarla en la vista
     */
    public void verDetalle() {
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = this.detaManager.obtenerPorId(this.detaDto.getId());
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
    }
    
    /**
     * Método guardar se encarga de guardar la entidad ControlPeriodicoDto, si la transacción se ejecuta correctamente, retorna 
     * la dirección de la vista controlPeriodicoDto.xhtml, en caso contrario retorna null
     * @return controlPeriodico.xhtml ó null
     */
    public String guardar() {        
        if (this.manager.guardar(this.dto) != null) {            
            this.editar();
        }        
        return null;
    }
    
    /**
     * Método guardarDetalle se encarga de guardar la entidad ControlPeriodicoDetaDto, si la transacción se ejecuta 
     * correctamente, retorna la variable resultado con valor true, caso contrario false.
     */
    public void guardarDetalles() {        
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;        
        try {
            if (this.detaManager.guardar(this.detaDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());                    
            }
            else {
                resultado = false;
            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
            logger.error(ex);
        }
        
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * bitacoraManager permite mostrar el historial de acciones realizadas sobre la entidad
     * @since 09/01/2014
     * @return retorna null
     */
    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    /**
     * Método retroceder retorna a la vista listaControlPeriodico.xhtml
     * @return retorna la dirección de la vista listaControlPeriodico.xhtml
     */
    public String retroceder() {
        buscar(null);
        return this.manager.getUrlLista();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public ControlPeriodicoDto getDto() {
        return dto;
    }

    public void setDto(ControlPeriodicoDto dto) {
        this.dto = dto;
    }

    public ControlPeriodicoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(ControlPeriodicoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<ControlPeriodicoDto> getLista() {
        return lista;
    }

    public void setLista(List<ControlPeriodicoDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ControlPeriodicoMBean.logger = logger;
    }  

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
    
    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public ControlPeriodicoManager getManager() {
        return manager;
    }

    public void setManager(ControlPeriodicoManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public ControlPeriodicoDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(ControlPeriodicoDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public String getKeyDetalleEntidad() {
        return keyDetalleEntidad;
    }

    public void setKeyDetalleEntidad(String keyDetalleEntidad) {
        this.keyDetalleEntidad = keyDetalleEntidad;
    }

    public ControlPeriodicoDetaManager getDetaManager() {
        return detaManager;
    }

    public void setDetaManager(ControlPeriodicoDetaManager detaManager) {
        this.detaManager = detaManager;
    }
}
